def merge(nums1, m, nums2, n):
    """
    合并两个按非递减顺序排列的数组
    :param nums1: 第一个数组，长度为m+n，其中前m个元素有效
    :param m: 第一个数组中有效元素的数量
    :param nums2: 第二个数组，长度为n
    :param n: 第二个数组的长度
    :return: 无返回值，合并结果存储在nums1中
    """
    # 从后往前填充nums1，避免覆盖nums1中尚未处理的元素
    p1 = m - 1  # nums1有效元素的指针
    p2 = n - 1  # nums2的指针
    p = m + n - 1  # 合并后数组的指针
    
    # 从后向前比较元素并填充
    while p1 >= 0 and p2 >= 0:
        if nums1[p1] > nums2[p2]:
            nums1[p] = nums1[p1]
            p1 -= 1
        else:
            nums1[p] = nums2[p2]
            p2 -= 1
        p -= 1
    
    # 如果nums2还有剩余元素，需要复制到nums1的前面
    # 如果nums1还有剩余元素，因为它们已经在正确的位置，所以不需要额外操作
    while p2 >= 0:
        nums1[p] = nums2[p2]
        p2 -= 1
        p -= 1

# 测试示例
if __name__ == "__main__":
    # 示例1
    nums1 = [1, 2, 3, 0, 0, 0]
    m = 3
    nums2 = [2, 5, 6]
    n = 3
    merge(nums1, m, nums2, n)
    print(nums1)  # 输出: [1, 2, 2, 3, 5, 6]
    
    # 示例2
    nums1 = [1]
    m = 1
    nums2 = []
    n = 0
    merge(nums1, m, nums2, n)
    print(nums1)  # 输出: [1]
    
    # 示例3
    nums1 = [0]
    m = 0
    nums2 = [1]
    n = 1
    merge(nums1, m, nums2, n)
    print(nums1)  # 输出: [1] 